/**
 * @file prototipo.h
 * @brief T.D.A. Prototipo
 * 
 * @author Antonio Ruano Cuesta
 * @date Mayo-06
 */
 
 /* Copyright 2010 Antonio Ruano Cuesta
 *
 * This program is free software: you can redistribute it and/or modify it under 
 * the terms of the GNU General Public License as published by the Free Software 
 * Foundation, either version 3 of the License, or (at your option) any later 
 * version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT 
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with 
 * this program. If not, see <http://www.gnu.org/licenses/>
*/

#ifndef PROTOTIPO
#define PROTOTIPO

/**
 * Atendiendo a la definición de un prototipo, la clase almacena la "clase" del prototipo, 
 * así como sus atributos y el número de éstos. La forma de almacenar los atributos será por 
 * medio de un vector dinámico de float.
 */
class prot{

  private:

	/**
       * @page repConjunto Rep del TDA Prototipo
       *
       * @section invConjunto Invariante de la representación
       *
       * El invariante es \e rep.clase > 0 y rep.n_atrib > 0;      
    */

    unsigned int clase; /**Valor de la clase del prototipo*/
    
	float *atributos; /**Puntero a float encargado de la reserva de memoria para atributos*/

	static unsigned int n_atrib; /**Número de atributos*/
    
	
  public:
		
	/**
     * @brief Constructor por defecto de la clase. Pone todos sus campos a 0
     */
    prot();
		
	/**
     * @brief Constructor de la clase.
     * @param clas: clase del prototipo.
     * @param n_atributos: número de atributos de los que consta el prototipo.
     * @return crea un prototipo de clase clas y n_atributos atributos,dejando éstos
     * con valores "basura".
     * @pre n_atributos > 0 y clas > 0.
    */	
    prot(unsigned int clas, int n_atributos);
		
	/**
     * @brief Constructor de copias de la clase.
     * @param prt prototipo del que se va a hacer la copia.
    */
	prot(const prot &prt);
		
	/**
     * @brief Destructor: libera la memoria reservada para el prototipo.
    */
	~prot();

	/**
     * @brief Asigna un prototipo(prototipo) a una variable del tipo prot.
     * @param prototipo: prototipo a asignar al objeto implícito.
	*/
	prot& operator=(const prot &prototipo);

	/**
     * @brief Inserta el valor de un atributo.
     * @param atr: valor del atributo.
	 * @param pos: posición en la que se quiere insertar dicho valor (nº de atributo).
	*/
	void set_atrib (float atr, int pos);

	/**
     * @brief Consulta el valor de un determinado atributo.
     * @param pos: posición en la que se quiere consultar.
	 * @return valor del atributo de la posición consultada (de tipo float).
	*/
	float get_atrib (int pos) const;

	/**
     * @brief Consulta el valor de la clase.
     * @return valor de la clase.
	*/
	unsigned int get_clase () const;

	/**
     * @brief Inserta en el prototipo un determinado valor de clase.
     * @param cls: valor de la clase a insertar.
	*/
	void set_clase (unsigned int cls);

	/**
     * @brief Consulta el valor del número de atributos del prototipo.
     * @return valor del número de atributos.
	*/
	static unsigned int &get_natr();
		
};



#endif
